
package beans;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


public class Controlador {
    
    
    // <editor-fold defaultstate="collapsed" desc="Propiedades">
    private List<Categoria> listaCategorias;
    private HashMap<String,List<CustomerZipcode>> listaCustomerZipcodes;        // <Fecha, lista<>>
    private HashMap<String,List<CardCube>> listaCardCubes;                      // <Fecha, lista<>>
    private HashMap<String,List<ConsumptionPattern>> listaConsumptioPatterns;   // <Fecha, lista<>>
    private String s_ZipcodesCercanosByUsuario="";
    private String s_DatosConsumoZipCodeByUsuario="";
        
    private final String URL_CATEGORIAS = "https://api.bbva.com/apidatos/info/merchants_categories.";
    private final String URL_CUSTOMER_ZIPCODES = "https://api.bbva.com/apidatos/zones/customer_zipcodes.";
    private final String URL_CARDS_CUBE = "https://api.bbva.com/apidatos/zones/cards_cube.";
    private final String URL_CONSUMPTION_PATTER = "https://api.bbva.com/apidatos/zones/consumption_pattern.";
    private final String USER_AGENT = "Mozilla/5.0";
    // </editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="SINGLETON">
    
    private static Controlador _instance = null;
    
    public static Controlador GetInstance(){
        if (_instance == null){
            _instance = new Controlador();
        }
        return _instance;
    }
    
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CONSTRUCTOR">
     
    private Controlador(){
        this.listaCategorias = new ArrayList<Categoria>();
        this.listaCardCubes = new HashMap<String, List<CardCube>>();
        this.listaConsumptioPatterns = new HashMap<String, List<ConsumptionPattern>>();
        this.listaCustomerZipcodes = new HashMap<String, List<CustomerZipcode>>();
        
    }
    
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="sendGetCategories">
    public List<Categoria> sendGetCategories(String response) throws Exception {
                
        URL obj = new URL(this.URL_CATEGORIAS+response);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        
        // por default es GET
        con.setRequestMethod("GET");
        
        //setear request header y el agente navegador
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Authorization", Enums.CODE_APP);
        int responseCode = con.getResponseCode();
       
        if(responseCode == 200){
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));

            //lectura
            String inputLine;
            StringBuffer result = new StringBuffer();            

            while ((inputLine = in.readLine()) != null) {
                result.append(inputLine);
            }
            in.close();

            System.out.println(result.toString());
            
            List<Categoria> listaCategorias = desseralizarDataCategorias(result.toString());
            this.setListaCategorias(listaCategorias);
            
            return listaCategorias;
            
        }
        else 
            return null;
         
    }
    
    
    private List<Categoria> desseralizarDataCategorias(String xml) throws ParserConfigurationException, SAXException, IOException{
    
        List<Categoria> listaCategorias = new ArrayList<Categoria>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	DocumentBuilder builder;
	builder = factory.newDocumentBuilder();  
	Document result = builder.parse(new InputSource(new StringReader(xml)));
        
        NodeList nodeLstCategorias = result.getElementsByTagName("category");
         for(int i=0; i<nodeLstCategorias.getLength(); i++){
             Categoria categoria = new Categoria();
             Node nodoCat = nodeLstCategorias.item(i);
             
             String code = nodoCat.getChildNodes().item(1).getTextContent();
                String des = nodoCat.getChildNodes().item(3).getTextContent();
             
             categoria.setCode(code);
             categoria.setDescription(des);
                
             listaCategorias.add(categoria);
         }
         
         
         return listaCategorias;       
    }
    // </editor-fold>
    
        
    // <editor-fold defaultstate="collapsed" desc="sendGetCustomerZipcodes">
    public HashMap sendGetCustomerZipcodes(String response, String date_min, String date_max, String groupBy, String cod_Category, 
                                   String zipCode, float latitud, float longitud, int zoom, int depth, String by) throws Exception {
        
        // Restricciones de parámetros:
        // 1.- response     -> Possible values : json or xml
        // 2.- date_min     -> Accepted formats: yyyymmdd, yyyymm
        // 3.- dae_max      -> Accepted formats: yyyymmdd, yyyymm
        // 4.- groupBy      -> Possible values : week or month
        // 5.- cod_Category -> Accepted codes  : Los "codigos" de las categorías ya cargadas.
        // 6.- zipCode      -> Accepted format : zipcode (5 digits). (Necesita Zoom, Latitud y Longitud, obligatorios)
        // 7.- latitud      -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 8.- longitud     -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 9.- zoom         -> Accepted values : 2. (No debe setearse el ZipCode)
        // 10.- depth       -> Possible values : 0,1,2(0: celda única, 1: barrio con 9 vecinos, 2: barrio con 25 vecinos)
        // 11.- by          -> Possible values : cards, payments or incomes(Indican cómo serán ordenados los zipcodes)
        
        
        String urlParametrizada = this.URL_CUSTOMER_ZIPCODES+response+"?"+"date_min="+date_min+"&"+"date_max="+date_max+"&"
                                           +"group_by="+groupBy;
        
        if(!cod_Category.equals(""))
            urlParametrizada=urlParametrizada+"&"+"category="+cod_Category;
        if(!zipCode.equals("")){
            urlParametrizada=urlParametrizada+"&"+"zipcode="+zipCode;
        }
        if(latitud!=0.0000 && longitud != 0.000) {
            urlParametrizada = urlParametrizada+"&"+"latitude="+latitud+"&"+"longitude="+longitud;
        }
        if(zoom>0){
            urlParametrizada = urlParametrizada+"&"+"zoom="+zoom;
        }
        if(depth>0){
            urlParametrizada = urlParametrizada+"&"+"depth="+depth;
        }
        
        urlParametrizada = urlParametrizada+"&"+"by="+by;
        
        URL obj = new URL(urlParametrizada);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        
        // por default es GET
        con.setRequestMethod("GET");
        
        //setear request header y el agente navegador
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Authorization", Enums.CODE_APP);
        
        int responseCode = con.getResponseCode();
        
        if(responseCode == 200){// consulta correcta
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));

            //lectura
            String inputLine;
            StringBuffer result = new StringBuffer();            

            while ((inputLine = in.readLine()) != null) {
                result.append(inputLine);
            }
            in.close();
            HashMap<String, List<CustomerZipcode>> mapa = desserializarDataCustomeZipCodes(result.toString());
            this.setListaCustomerZipcodes(mapa);
            return mapa;
        }
        else
            return null;
        
        
        
        //print result
        
        
    }
    
    private HashMap desserializarDataCustomeZipCodes(String xml) throws ParserConfigurationException, SAXException, IOException{
        List<CustomerZipcode> listaZipcodes = new ArrayList<CustomerZipcode>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	DocumentBuilder builder;
	builder = factory.newDocumentBuilder();  
	Document result = builder.parse(new InputSource(new StringReader(xml)));
        
        HashMap<String, List<CustomerZipcode>> mapa = new HashMap<String, List<CustomerZipcode>>();
                
        NodeList nlMeses = result.getElementsByTagName("date");
        NodeList nlZipcodes = result.getElementsByTagName("zipcodes");
                   
       
       for(int i=0; i<nlMeses.getLength(); i++){
             CustomerZipcode zipcode = new CustomerZipcode();
             Node nodoMes = nlMeses.item(i);
             Node nodoZipcode = nlZipcodes.item(i);
             
             String mes = nodoMes.getTextContent();
             NodeList listaItems = nodoZipcode.getChildNodes();
             
             List<CustomerZipcode> listaZipcodesInter = new ArrayList<CustomerZipcode>();
             for(int j=1; j<=listaItems.getLength(); j++){
                 
                 Node item = listaItems.item(j);
                 
                 if(item != null){
                    if(item.getNodeType() == Node.ELEMENT_NODE){
                        
                     zipcode = new CustomerZipcode();
                     zipcode.setZipcode(item.getChildNodes().item(1).getTextContent()) ;
                     zipcode.setNumCards(Integer.valueOf(item.getChildNodes().item(3).getTextContent())) ;
                     zipcode.setNumPayments(Integer.valueOf(item.getChildNodes().item(5).getTextContent())) ;
                     zipcode.setIncomes(Double.valueOf(item.getChildNodes().item(7).getTextContent())) ;
                     
                     listaZipcodesInter.add(zipcode);
                    }
                 }
             }        
             
             mapa.put(mes, listaZipcodesInter);
         }
         
         
         return mapa;    
    }
    
    
    
    // </editor-fold>
        
    
    // <editor-fold defaultstate="collapsed" desc="sendGetCardsCube">
    
    public HashMap sendGetCardsCube(String response, String date_min, String date_max, String groupBy, String cod_Category, 
                                   String zipCode, float latitud, float longitud, int zoom, int depth) throws Exception {
        
        // Restricciones de parámetros:
        // 1.- response     -> Possible values : json or xml
        // 2.- date_min     -> Accepted formats: yyyymmdd, yyyymm
        // 3.- dae_max      -> Accepted formats: yyyymmdd, yyyymm
        // 4.- groupBy      -> Possible values : week or month
        // 5.- cod_Category -> Accepted codes  : Los "codigos" de las categorías ya cargadas.
        // 6.- zipCode      -> Accepted format : zipcode (5 digits). (Necesita Zoom, Latitud y Longitud, obligatorios)
        // 7.- latitud      -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 8.- longitud     -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 9.- zoom         -> Accepted values : 2. (No debe setearse el ZipCode)
        // 10.- depth       -> Possible values : 0,1,2(0: celda única, 1: barrio con 9 vecinos, 2: barrio con 25 vecinos)
                
        
        String urlParametrizada = this.URL_CARDS_CUBE+response+"?"+"date_min="+date_min+"&"+"date_max="+date_max+"&"
                                           +"group_by="+groupBy;
        
        if(!cod_Category.equals(""))
            urlParametrizada=urlParametrizada+"&"+"category="+cod_Category;
        if(!zipCode.equals("")){
            urlParametrizada=urlParametrizada+"&"+"zipcode="+zipCode;
        }
        if(latitud!=0.0000 && longitud != 0.000) {
            urlParametrizada = urlParametrizada+"&"+"latitude="+latitud+"&"+"longitude="+longitud;
        }
        if(zoom>0){
            urlParametrizada = urlParametrizada+"&"+"zoom="+zoom;
        }
        if(depth>0){
            urlParametrizada = urlParametrizada+"&"+"depth="+depth;
        }
        
                
        URL obj = new URL(urlParametrizada);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        
        // por default es GET
        con.setRequestMethod("GET");
        
        //setear request header y el agente navegador
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Authorization", Enums.CODE_APP);
        
        int responseCode = con.getResponseCode();
        
        if(responseCode == 200){// consulta correcta
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));

            //lectura
            String inputLine;
            StringBuffer result = new StringBuffer();            

            while ((inputLine = in.readLine()) != null) {
                result.append(inputLine);
            }
            in.close();
            
            HashMap<String, List<CardCube>> mapa = desserializarDataCardsCube(result.toString());
            this.setListaCardCubes(mapa);
            return mapa;
        }
        else
            return null;       
        
        
        //print result    
        
    }
    
    
    private HashMap desserializarDataCardsCube(String xml) throws ParserConfigurationException, SAXException, IOException{
        
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	DocumentBuilder builder;
	builder = factory.newDocumentBuilder();  
	Document result = builder.parse(new InputSource(new StringReader(xml)));
        
        HashMap<String, List<CardCube>> mapa = new HashMap<String, List<CardCube>>();
                
        NodeList nlMeses = result.getElementsByTagName("date");
        NodeList nlCubes = result.getElementsByTagName("cube");
                   
       
       for(int i=0; i<nlMeses.getLength(); i++){
             CardCube cardcube = null;
             Node nodoMes = nlMeses.item(i);
             Node nodoCell = nlCubes.item(i);
             
             String mes = nodoMes.getTextContent();
             NodeList listaItems = nodoCell.getChildNodes();
             
             List<CardCube> listaCardCubesInter = new ArrayList<CardCube>();
             for(int j=1; j<=listaItems.getLength(); j++){
                 
                 Node item = listaItems.item(j);
                 
                 if(item != null){
                    if(item.getNodeType() == Node.ELEMENT_NODE){
                        
                     cardcube = new CardCube();
                     String[] hash = item.getChildNodes().item(1).getTextContent().toString().split("#");
                     if(hash.length == 2){
                        cardcube.setGenero(hash[0]) ;
                        cardcube.setGrupoEdad(hash[1]) ;
                     }
                     cardcube.setNroCards(Integer.valueOf(item.getChildNodes().item(3).getTextContent())) ;
                     cardcube.setNroPayments(Integer.valueOf(item.getChildNodes().item(5).getTextContent())) ;
                     cardcube.setPromedioGasto(Double.valueOf(item.getChildNodes().item(7).getTextContent())) ;
                     
                     listaCardCubesInter.add(cardcube);
                    }
                 }
             }        
             
             mapa.put(mes, listaCardCubesInter);
         }
         
         
         return mapa;    
    }
    // </editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="sendGetConsumptionPattern">
    
    public HashMap sendGetConsumptionPattern(String response, String date_min, String date_max, String groupBy, String cod_Category, 
                                   String zipCode, float latitud, float longitud, int zoom, int depth) throws Exception {
        
        // Restricciones de parámetros:
        // 1.- response     -> Possible values : json or xml
        // 2.- date_min     -> Accepted formats: yyyymmdd, yyyymm
        // 3.- dae_max      -> Accepted formats: yyyymmdd, yyyymm
        // 4.- groupBy      -> Possible values : week or month
        // 5.- cod_Category -> Accepted codes  : Los "codigos" de las categorías ya cargadas.
        // 6.- zipCode      -> Accepted format : zipcode (5 digits). (Necesita Zoom, Latitud y Longitud, obligatorios)
        // 7.- latitud      -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 8.- longitud     -> Accepted format : XX.XXXXX (No debe setearse el ZipCode) 
        // 9.- zoom         -> Accepted values : 2. (No debe setearse el ZipCode)
        // 10.- depth       -> Possible values : 0,1,2(0: celda única, 1: barrio con 9 vecinos, 2: barrio con 25 vecinos)
                
        
        String urlParametrizada = this.URL_CONSUMPTION_PATTER+response+"?"+"date_min="+date_min+"&"+"date_max="+date_max+"&"
                                           +"group_by="+groupBy;
        
        if(!cod_Category.equals(""))
            urlParametrizada=urlParametrizada+"&"+"category="+cod_Category;
        if(!zipCode.equals("")){
            urlParametrizada=urlParametrizada+"&"+"zipcode="+zipCode;
        }
        if(latitud!=0.0000 && longitud != 0.000) {
            urlParametrizada = urlParametrizada+"&"+"latitude="+latitud+"&"+"longitude="+longitud;
        }
        if(zoom>0){
            urlParametrizada = urlParametrizada+"&"+"zoom="+zoom;
        }
        if(depth>0){
            urlParametrizada = urlParametrizada+"&"+"depth="+depth;
        }
        
                
        URL obj = new URL(urlParametrizada);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        
        // por default es GET
        con.setRequestMethod("GET");
        
        //setear request header y el agente navegador
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Authorization", Enums.CODE_APP);
        
        int responseCode = con.getResponseCode();
        
        if(responseCode == 200){// consulta correcta
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));

            //lectura
            String inputLine;
            StringBuffer result = new StringBuffer();            

            while ((inputLine = in.readLine()) != null) {
                result.append(inputLine);
            }
            in.close();
            
            HashMap<String, List<ConsumptionPattern>> mapa = desserializarDataConsumptionPattern(result.toString());
            this.setListaConsumptioPatterns(mapa);
            return mapa;
        }
        else
            return null;       
        
        
        //print result    
        
    }
    
    
    private HashMap desserializarDataConsumptionPattern(String xml) throws ParserConfigurationException, SAXException, IOException{
        
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
	DocumentBuilder builder;
	builder = factory.newDocumentBuilder();  
	Document result = builder.parse(new InputSource(new StringReader(xml)));
        
        HashMap<String, List<ConsumptionPattern>> mapa = new HashMap<String, List<ConsumptionPattern>>();
                
        NodeList nlMeses = result.getElementsByTagName("date");
        NodeList nlDays = result.getElementsByTagName("days");
                   
       
       for(int i=0; i<nlMeses.getLength(); i++){
             ConsumptionPattern consuptionPattern = null;
             Node nodoMes = nlMeses.item(i);
             Node nodoItem = nlDays.item(i);
             
             String mes = nodoMes.getTextContent();
             NodeList listaItems = nodoItem.getChildNodes();
             
             List<ConsumptionPattern> listaConsumptionInter = new ArrayList<ConsumptionPattern>();
             for(int j=1; j<=listaItems.getLength(); j++){
                 
                 Node item = listaItems.item(j);
                 
                 if(item != null){
                    if(item.getNodeType() == Node.ELEMENT_NODE){
                        
                     consuptionPattern = new ConsumptionPattern();
                     
                     consuptionPattern.setRangoTiempo(item.getChildNodes().item(1).getTextContent()) ;
                     consuptionPattern.setPromedio(Double.valueOf(item.getChildNodes().item(3).getTextContent())) ;
                     consuptionPattern.setMaximo(Double.valueOf(item.getChildNodes().item(5).getTextContent())) ;
                     consuptionPattern.setMinimo(Double.valueOf(item.getChildNodes().item(7).getTextContent())) ;
                     consuptionPattern.setEstandar(Double.valueOf(item.getChildNodes().item(9).getTextContent())) ;
                     consuptionPattern.setModo(Double.valueOf(item.getChildNodes().item(11).getTextContent())) ;
                     consuptionPattern.setNroCards(Integer.valueOf(item.getChildNodes().item(13).getTextContent())) ;
                     consuptionPattern.setNroPayments(Integer.valueOf(item.getChildNodes().item(15).getTextContent())) ;
                     
                                    
                     
                     listaConsumptionInter.add(consuptionPattern);
                    }
                 }
             }        
             
             mapa.put(mes, listaConsumptionInter);
         }
         
         
         return mapa;    
    }
    // </editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="getZipCodesCercanosByUsuario">
    
    public String getZipCodesCercanosByUsuario(Usuario usuario) throws Exception{
        
        String lista="";
        for(Categoria categoria: usuario.getListaCategorias() ){
            HashMap<String, List<CustomerZipcode>> mapaZipCodes = this.sendGetCustomerZipcodes("xml", "201211", "201303", "month", categoria.getCode(), usuario.getCodigoPostal(), 0, 0, 2, 1, "payments");
            
            List<CustomerZipcode> listaFiltrada = new ArrayList<CustomerZipcode>();

            for (Map.Entry<String, List<CustomerZipcode>> elemento : mapaZipCodes.entrySet()) {
                List<CustomerZipcode> listaZipCodes = elemento.getValue();
                for(CustomerZipcode item : listaZipCodes){
                    listaFiltrada = esMejor(item.getZipcode(), item.getNumPayments(), item.getNumCards(), item.getIncomes(), listaFiltrada);                
               }
            }

            for(CustomerZipcode item: listaFiltrada){
                lista=lista+item.getZipcode()+"#";
            }

            this.setS_ZipcodesCercanosByUsuario(lista);
        }
        return lista;
    }
    
    private List<CustomerZipcode> esMejor(String zipcdode, int nro_payments, int nro_cards, double incomes, List<CustomerZipcode> listaActual){
        boolean ok = false;
        for(int i=0; i<listaActual.size(); i++){
            if(listaActual.get(i).getZipcode().equals(zipcdode) && nro_payments>listaActual.get(i).getNumPayments()){
                // si existe uno con mejor nro_payments actualizo los datos de ese item de la lista filtrada
                // para siempre tener el mejor
                listaActual.get(i).setNumCards(nro_cards);
                listaActual.get(i).setIncomes(incomes);
                listaActual.get(i).setNumPayments(nro_payments);
                ok = true;
            }
        }
        
        if(!ok){// si no encontro ningun es xq es uno nuevo
            CustomerZipcode zipcode = new CustomerZipcode();
            zipcode.setZipcode(zipcdode);
            zipcode.setIncomes(incomes);
            zipcode.setNumCards(nro_cards);
            zipcode.setNumPayments(nro_payments);
            listaActual.add(zipcode);
        }
        return listaActual;
    }
    
    // </editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="getDatosConsumoByZicodeUsuario">
    
    public String getDatosConsumoByZicodeUsuario(Usuario usuario) throws Exception{
        
        String lista="";
        String sexo = usuario.getSexo();
        String grupo_edad = obtenerGrupoEdad(usuario.getFechanacimiento());
        
        for(Categoria categoria: usuario.getListaCategorias() ){
            HashMap<String, List<CardCube>> hmCardCubes =  Controlador.GetInstance().sendGetCardsCube("xml", "201211", "201303", "month", categoria.getCode(), usuario.getCodigoPostal(), 0, 0, 2, 1);
            
            
            CardCube mejor = new CardCube();
            for (Map.Entry<String, List<CardCube>> elemento : hmCardCubes.entrySet()) {
                List<CardCube> listaCardCubes = elemento.getValue();
                for(CardCube item : listaCardCubes){
                    if(item.getGenero().equals(sexo) && item.getGrupoEdad().equals(grupo_edad) && item.getPromedioGasto()>mejor.getPromedioGasto()){
                        mejor = item;
                    }
               }
            }

            
            lista=lista+categoria.getDescription()+"#"+mejor.getPromedioGasto()+"@";
            

            this.setS_DatosConsumoZipCodeByUsuario(lista);
        }
        return lista;
    }
    
   
    
    private String  obtenerGrupoEdad(Date fecha){
        int edad = calcularEdad(fecha);
        if(edad != -1){
            if(edad<19){
                return Enums.AGE_UNDER_19.toString();
            }else if(edad>=19 && edad <=25){
                return Enums.AGE_BET_19_25.toString();
            }else if(edad>=19 && edad <=25){
                return Enums.AGE_BET_19_25.toString();
            }else if(edad>=26 && edad <=35){
                return Enums.AGE_BET_26_35.toString();
            }else if(edad>=36 && edad <=45){
                return Enums.AGE_BET_36_45.toString();
            }else if(edad>=46 && edad <=55){
                return Enums.AGE_BET_46_55.toString();
            }else if(edad>=56 && edad <=65){
                return Enums.AGE_BET_56_65.toString();
            }else if(edad>65){
                return Enums.AGE_GREAT_65.toString();
            }
        }
        return Enums.AGE_UNKNOWN;
    }
    
    private int calcularEdad(Date fecha) {
        
        try {
            Calendar birth = new GregorianCalendar();
            Calendar today = new GregorianCalendar();
            int age = 0;
            int factor = 0;
            Date birthDate = fecha;
            Date currentDate = new Date(Calendar.getInstance().getTimeInMillis()); //current date
            birth.setTime(birthDate);
            today.setTime(currentDate);
            if (today.get(Calendar.MONTH) <= birth.get(Calendar.MONTH)) {
                if (today.get(Calendar.MONTH) == birth.get(Calendar.MONTH)) {
                    if (today.get(Calendar.DATE) > birth.get(Calendar.DATE)) {
                        factor = -1; //Aun no celebra su cumpleaÃ±os
                    }
                } else {
                    factor = -1; //Aun no celebra su cumpleaÃ±os
                }
            }
            age = (today.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) + factor;
            return age;
        } catch (Exception e) {
            return -1;
        }

    }
    // </editor-fold>
    
    
    // <editor-fold defaultstate="collapsed" desc="Getter y Setter">
    public List<Categoria> getListaCategorias() {
        return listaCategorias;
    }

   
    public void setListaCategorias(List<Categoria> listaCategorias) {
        this.listaCategorias = listaCategorias;
    }
    
    
    public HashMap<String,List<CardCube>> getListaCardCubes() {
        return listaCardCubes;
    }

  
    public void setListaCardCubes(HashMap<String,List<CardCube>> listaCardCubes) {
        this.listaCardCubes = listaCardCubes;
    }

   
    public HashMap<String,List<ConsumptionPattern>> getListaConsumptioPatterns() {
        return listaConsumptioPatterns;
    }

  
    public void setListaConsumptioPatterns(HashMap<String,List<ConsumptionPattern>> listaConsumptioPatterns) {
        this.listaConsumptioPatterns = listaConsumptioPatterns;
    }
    
    
    public HashMap<String,List<CustomerZipcode>> getListaCustomerZipcodes() {
        return listaCustomerZipcodes;
    }

   
    public void setListaCustomerZipcodes(HashMap<String,List<CustomerZipcode>> listaCustomerZipcodes) {
        this.listaCustomerZipcodes = listaCustomerZipcodes;
    }
    
     public String getS_ZipcodesCercanosByUsuario() {
        return s_ZipcodesCercanosByUsuario;
    }

    
    public void setS_ZipcodesCercanosByUsuario(String s_ZipcodesCercanosByUsuario) {
        this.s_ZipcodesCercanosByUsuario = s_ZipcodesCercanosByUsuario;
    }
    
      public String getS_DatosConsumoZipCodeByUsuario() {
        return s_DatosConsumoZipCodeByUsuario;
    }

  
    public void setS_DatosConsumoZipCodeByUsuario(String s_DatosConsumoZipCodeByUsuario) {
        this.s_DatosConsumoZipCodeByUsuario = s_DatosConsumoZipCodeByUsuario;
    }

    // </editor-fold>

}
